#include<stdio.h>
#include<string.h>

int allenStrlen(char *s);
int allenStrchr(char *s, char c);
void allenStrcpy(char *s, char *t);
int allenStrstr(char *source, char *find);

int main(){
    //字符串，其实就是char字符的一维数组，最后一个元素用\0存储
    char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
    printf("str = %s\n", str);

    char str1[20];
    strcpy(str1, str);
    printf("strcpy(str1, str); str1 = %s\n", str1);
    
    char str2[6] = {'w', 'o', 'r', 'l', 'd'};
    strcat(str1, str2);
    printf("strcat(str1, str2); str1 = %s\n", str1);
    printf("strlen(str1) = %lu\n", strlen(str1));//strlen()是不包含\0的哦

    //字符串比较，strcmp(str1, str2),相等返回0， str1>str2返回大于0， 反之返回小于零
    printf("strcmp(str1, str) = %d\n", strcmp(str1, str));

    //strchr(s, c)返回一个指针，字符串s中第一次出现字符c的位置
    char name[12] = "allenzhang";
    printf("name = %s\n", name);
    char *first;
    first = strchr(name, 'z');
    printf("strchr('allenzhang', 'z'), %c\n", *first);

    //allenStrlen
    char allenS1[10] = "abcd中";
    //形参allenS1是一个数组，方法allenStrlen()的形参是个指针，allenStrlen(allenS1)表示把数组allenS1的第一个元素的地址传递给指针s
    //allenStrlen(allenS1) 等同于 allenStrlen(&allenS1[0])
    printf("allenStrlen(allenS1) = %d\n", allenStrlen(allenS1));//output: 7
    printf("allenStrlen(&allenS1[0]) = %d\n", allenStrlen(&allenS1[0]));
    printf("allenStrlen('abcd中') = %d\n", allenStrlen("abcd中"));

    //allenStrcpy
    char from[] = "哈哈哈haha";
    char to[20];
    allenStrcpy(to, from);
    printf("allenStrcpy(to, from), from = %s, to = %s\n", from, to);

    //allenStrchr
    char s4[] = "abcd你好";
    char find4 = 'c';
    printf("allenStrchr(s4, find4) = %d\n", allenStrchr(s4, find4));//output: 2

    //allenStrstr
    char s5[] = "abcabcdef一二abc";
    char find5[] = "一";
    printf("allenStrstr(s5, find5) = %d\n", allenStrstr(s5, find5));//output: 9

    return 0;
}

//自己实现一个strlen(s)函数，计算字符串长度
//指针是可以做加减运算的哦，当指针指向的是一个数组的某个元素x时，指针加减i，就等同于指向数组第x加减i个元素
//函数的定义allenStrlen(char *s)等同于allenStrlen(char s[])
int allenStrlen(char *s){
    int i,j = 0;
    // while (*(s + i) != '\0')
    // {
    //     i++;
    // }

    //或者另一个版本
    for( ; *s != '\0'; s++){
        j++;
    }

    return j;
}

//自己实现strcpy
void allenStrcpy(char *s, char *t){
    while (*t != '\0')
    {
        *s = *t;
        t++;
        s++;
    }
    //优化版本
    // while ((*s++ = *t++) != '\0')
    // {
    //     ;
    // }
    
    

    return ;
}

//自己实现一个strchr(s, c)函数，查找字符串s中第一个c字符出现的位置
int allenStrchr(char *s, char c){
    int i = 0;
    while (*s != c)
    {
        s++;
        i++;
    }
    
    return i;
}

//自己实现一个strstr(s1, s2)函数，查找字符串s1中出现的第一次s2的位置
int allenStrstr(char *source, char *find){
    for (int i = 0; *(source + i) != '\0'; i++)
    {
        //比较
        for (int j = 0; *(find + j) != '\0'; j++)
        {
            if (*(find + j) != *(source + i + j)){
                break;
            }else{
                if (*(find + j + 1) == '\0'){
                    //匹配成功
                    return i;
                }
            }
        }

    }
    
    //匹配失败
    return -1;
}